有時必須將物件分離又礙於傳參考的特性,就會使用到淺層複製 or 深層複製
for (var key in obj)
var family = {
name: '小明家',
members: {
father: '老爸',
mom: '老媽',
ming: '小明'
}
}
// 新增一空物件
var newFamily = {};
// 使用 for in 語法
for (var key in family){
console.log(key);
// name
// members
// key 值包含了 family 的第一層屬性
console.log(family[key]);
// name 小明家
// members {father: '老爸', mom: '老媽',ming: '小明'}
newFamily[key] = family[key];
}
newFamily.name = '杰倫家';
console.log(family, newFamily);
// {name: '小明家', members:{...}}
// {name: '杰倫家', members:{...}}
// 若是嘗試修改第二層屬性的內容
newFamily.members.ming = '大明';
console.log(family, newFamily);
// {name: '小明家', members:{father: '老爸', mom: '老媽', ming: '大明'}}
// {name: '杰倫家', members:{father: '老爸', mom: '老媽', ming: '大明'}}
// 兩個 members 物件內容的 ming 都被修改成 '大明' 了
// 第二層以上還是會以傳參考的形式去做修改
extend()
var newFamily2 = jQuery.extend({}, family);
var newFamily3 = Object.assign({}, family);
JSON.stringify
將原本物件轉為字串,然後再用 JSON.parse
轉回物件var newFamily4 = JSON.parse(JSON.stringify(family));
newFamily4.name = '杰倫家';
newFamily4.members.ming = '大明';
console.log(family, newFamily);
// {name: '小明家', members:{father: '老爸', mom: '老媽', ming: '小明'}}
// {name: '杰倫家', members:{father: '老爸', mom: '老媽', ming: '大明'}}
// 修改後也不會影響到原本的物件內容,兩者之間完全沒有關聯